using System;
using System.Windows.Forms;

public class DGVCalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
{
    private DataGridView dataGridView;
    private bool valueChanged = false;
    private int rowIndex;

    public DGVCalendarEditingControl()
        : base()
    {
        this.Format = DateTimePickerFormat.Short;
    }

    // IDataGridViewEditingControl.EditingControlFormattedValue property.
    public object EditingControlFormattedValue
    {
        get { return this.Value.ToShortDateString(); }
        set
        {
            if (value is String)
            {
                this.Value = DateTime.Parse((String)value);
            }
        }
    }

    // IDataGridViewEditingControl.GetEditingControlFormattedValue method.
    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
        return EditingControlFormattedValue;
    }

    // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
    {
        this.Font = dataGridViewCellStyle.Font;
        this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
        this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
    }

    // IDataGridViewEditingControl.EditingControlRowIndex property.
    public int EditingControlRowIndex
    {
        get { return this.rowIndex; }
        set { this.rowIndex = value; }
    }

    // IDataGridViewEditingControl.EditingControlWantsInputKey method.
    public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
    {
        // Let the DateTimePicker handle the keys listed.
        switch (key & Keys.KeyCode)
        {
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
            case Keys.Right:
            case Keys.Home:
            case Keys.End:
            case Keys.PageDown:
            case Keys.PageUp:
                return true;
            default:
                return false;
        }
    }

    // IDataGridViewEditingControl.PrepareEditingControlForEdit method.
    public void PrepareEditingControlForEdit(bool selectAll)
    {
        // No preparation needs to be done.
    }

    // IDataGridViewEditingControl.RepositionEditingControlOnValueChange property.
    public bool RepositionEditingControlOnValueChange
    {
        get { return false; }
    }

    // IDataGridViewEditingControl.EditingControlDataGridView property.
    public DataGridView EditingControlDataGridView
    {
        get { return this.dataGridView; }
        set { this.dataGridView = value; }
    }

    // IDataGridViewEditingControl.EditingControlValueChanged property.
    public bool EditingControlValueChanged
    {
        get { return this.valueChanged; }
        set { this.valueChanged = value; }
    }

    // IDataGridViewEditingControl.EditingPanelCursor property.
    public Cursor EditingPanelCursor
    {
        get { return base.Cursor; }
    }

    protected override void OnValueChanged(EventArgs eventargs)
    {
        // Notify the DataGridView that the contents of the cell have changed.
        this.valueChanged = true;
        this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
        base.OnValueChanged(eventargs);
    }
}
